/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dlc.indexado.lectura;


import java.io.File;
import java.util.HashMap;
import java.util.LinkedList;
import dlc.modelo.Palabra;
import dlc.persistencia.HiloGrabadorArchivos;


public class DefaultListener extends Listener {

    private String palabraCadena = "";
    private HashMap<String, Palabra> vocabulario;
    private HiloGrabadorArchivos hiloGrabador;
    private int nroPalabras;

    public int getNroPalabras() {
        return nroPalabras;
    }

    /**
     * DefaultListener guarda el documento sobre el que se trabaja, el nro de 
     * palabras del mismo, un HashMap con las palabras del mismo y un objeto
     * HiloGrabador encargado de persistir el mismo en la DB 
     * @param doc documento a ser procesado
     * @param hiloGrabador objeto encargado de persistir vocuabulario, doc y posteos
     */
    public DefaultListener(File doc, HiloGrabadorArchivos hiloGrabador) {
        super(doc);
        vocabulario = new HashMap<String, Palabra>();
        this.hiloGrabador = hiloGrabador;
        nroPalabras = 0;
    }

    @Override
    /**
     * Este metodo es llamado por el Reader en cada "iteración" o "llenado de buffer"
     * toma como entrada una linea del documento, luego la separa en palabras 
     * guardandola en una LinkedList. Por cada palabra:
     * Si es nueva cre un objeto Palabra y lo guarda en el HashMap "vocabulario"
     * Si ya está en vocabulario, le suma uno al tf de dicha palabra
     */
    public boolean listo(String c) {
        String caracteresPagina = Utils.limpiarAcentos(c);
        LinkedList<String> listaPalabras = Utils.separarPalabras(caracteresPagina);
        for (int index = 0; index < listaPalabras.size(); index++) {
            Palabra palabraNueva = new Palabra(listaPalabras.get(index));
            //Si es nueva la palabra la agregarla, de lo contrario aumentar tf
            nroPalabras++;

            Palabra palabraAnterior;
            if ((palabraAnterior = vocabulario.get(palabraNueva.getTermino())) != null) {
                palabraAnterior.addTf();
            } else {
                vocabulario.put(palabraNueva.getTermino(), palabraNueva);
                palabraCadena = "";
                listaPalabras.remove(index);
            }

        }
        return true;
    }

    @Override
    /**
     *Este método es llamado por el Reader al momento de finalizar la
     *Lectura del archivo correspondiente.
     * Si el hiloGrabador es null lo instancia. Luego llama al metodo startServer
     * sobre el objeto DefaultListener actual.
     */
    public boolean fin() {
        if (hiloGrabador == null) {
            hiloGrabador = new HiloGrabadorArchivos();
        }
        hiloGrabador.startServer(this);
        return true;
    }

    public HashMap<String, Palabra> getVocabulario() {
        return vocabulario;
    }

    public void setVocabulario(HashMap<String, Palabra> vocabulario) {
        this.vocabulario = vocabulario;
    }
}
